package es.gesfutbol.web;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.ui.ModelMap;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import es.gesfutbol.dao.IPartitDeQuinielaDao;
import es.gesfutbol.dao.IPenyaDao;
import es.gesfutbol.dao.IPenyistaDao;
import es.gesfutbol.dao.IPronosticDao;
import es.gesfutbol.dao.IQuinielaDao;
import es.gesfutbol.dao.IUsuariRegistratDao;
import es.gesfutbol.domini.implementacio.PartitDeQuiniela;
import es.gesfutbol.domini.implementacio.Penya;
import es.gesfutbol.domini.implementacio.Penyista;
import es.gesfutbol.domini.implementacio.Pronostic;
import es.gesfutbol.domini.implementacio.Quiniela;
import es.gesfutbol.domini.implementacio.UsuariRegistrat;
import es.gesfutbol.util.OrdenaPenyistesPerId;
import es.gesfutbol.util.PosicioQuinielaComparator;
import es.gesfutbol.web.backbean.PronosticsBackBean;

public class CrearQuinielaController  extends MultiActionController {
	
	private IPenyaDao penyaDao;
	private IPenyistaDao penyistaDao;	
	private IUsuariRegistratDao usuariRegistratDao;
	private IQuinielaDao quinielaDao;
	private IPartitDeQuinielaDao partitDeQuinielaDao;
	private IPronosticDao pronosticDao;
	
	public IPenyistaDao getPenyistaDao() {
		return penyistaDao;
	}

	public void setPenyistaDao(IPenyistaDao penyistaDao) {
		this.penyistaDao = penyistaDao;
	}

	public IUsuariRegistratDao getUsuariRegistratDao() {
		return usuariRegistratDao;
	}

	public void setUsuariRegistratDao(IUsuariRegistratDao usuariRegistratDao) {
		this.usuariRegistratDao = usuariRegistratDao;
	}
	
	public IQuinielaDao getQuinielaDao(){
		return quinielaDao;
	}
	
	public void setQuinielaDao(IQuinielaDao quinielaDao){
		this.quinielaDao = quinielaDao;
	}
	
	public IPartitDeQuinielaDao getPartitDeQuinielaDao(){
		return partitDeQuinielaDao;
	}
	
	public void setPartitDeQuinielaDao(IPartitDeQuinielaDao partitDeQuinielaDao){
		this.partitDeQuinielaDao = partitDeQuinielaDao;
	}
	
	public IPenyaDao getPenyaDao() {
		return penyaDao;
	}

	public void setPenyaDao(IPenyaDao penyaDao) {
		this.penyaDao = penyaDao;
	}
	
	public IPronosticDao getPronosticDao() {
		return pronosticDao;
	}

	public void setPronosticDao(IPronosticDao pronosticDao) {
		this.pronosticDao = pronosticDao;
	}

	public ModelAndView init(HttpServletRequest request,
			HttpServletResponse response)throws Exception{
		
		//Busquem la penya del penyista
		String sAlies = request.getParameter("alies");
		UsuariRegistrat usuari = usuariRegistratDao.findByAlies(sAlies);
		 
		Penyista penyista = penyistaDao.findByIdUsuari(usuari.getIdUsuari());
		penyista = penyistaDao.deproxy(penyista);
		
		Penya penya = penyista.getPenya();
		penya = penyaDao.deproxy(penya);
		
		Set<Penyista> peny = penya.getPenyistes();
		peny = penyistaDao.deproxyPronostics(peny);
		
		Set<Penyista> penyistes = new HashSet<Penyista>(); 
		
		Iterator<Penyista> itPeny = peny.iterator();
		while(itPeny.hasNext()){
			Penyista pe = itPeny.next();
			if(pe.isPronostica())	penyistes.add(pe);
		}
		List<Penyista> penyistes2 = new ArrayList<Penyista>(penyistes);
		Collections.sort(penyistes2, new OrdenaPenyistesPerId());
					
		
		//Busquem la travessa de la jornada
		Quiniela quiniela = quinielaDao.findQuinielaActiva();
		quiniela = quinielaDao.deproxy(quiniela);
		Set<PartitDeQuiniela> partits = quiniela.getPartits();
		List<PartitDeQuiniela> partitsDeQuiniela = new ArrayList<PartitDeQuiniela>(partits);
		partitsDeQuiniela = partitDeQuinielaDao.deproxylist(partitsDeQuiniela);
		Collections.sort(partitsDeQuiniela, new PosicioQuinielaComparator());
			
		ModelMap model = new ModelMap();
		model.put("penya",penya);
		model.put("quinielaActiva", quiniela);
		model.put("llistatPartits", partitsDeQuiniela);
		model.put("llistatPenyistes", penyistes2);
		return new ModelAndView("usuari/crearQuiniela", model);		
	}
	
	public ModelAndView savePronostics(HttpServletRequest request,
			HttpServletResponse response, PronosticsBackBean pronostics)throws Exception{
		
		String sAlies = pronostics.getAliesPenyista();
		UsuariRegistrat usuari = usuariRegistratDao.findByAlies(sAlies);		
		Penyista penyista = penyistaDao.findByIdUsuari(usuari.getIdUsuari());
			
		Quiniela quiniela = quinielaDao.findQuinielaActiva();
		Long idQuiniela = quiniela.getIdQuiniela();
		
		List<PartitDeQuiniela> partits = new ArrayList<PartitDeQuiniela>(15);
				
		for (int i = 0; i < 16; i ++){
			partits.add(i, partitDeQuinielaDao.findByQuinielaIPosicio(idQuiniela, i+1));
		}
		List<Integer> lp = new ArrayList<Integer>();
		lp.add(pronostics.getP1());
		lp.add(pronostics.getP2());
		lp.add(pronostics.getP3());
		lp.add(pronostics.getP4());
		lp.add(pronostics.getP5());
		lp.add(pronostics.getP6());
		lp.add(pronostics.getP7());
		lp.add(pronostics.getP8());
		lp.add(pronostics.getP9());
		lp.add(pronostics.getP10());
		lp.add(pronostics.getP11());
		lp.add(pronostics.getP12());
		lp.add(pronostics.getP13());
		lp.add(pronostics.getP14());
		lp.add(pronostics.getP15());
		
		List<Pronostic> pronosticsFets = new ArrayList<Pronostic>();
		
		int contador = 0;
		for(Integer iP : lp){
		
				Pronostic p1 = new Pronostic();
				p1 = pronosticDao.findByPartitQuinielaIAdministrador(partits.get(contador).getIdPartitDeQuiniela(),
						penyista.getIdPenyista());

				if(p1==null) p1 = new Pronostic();
				
				p1.setPartitDeQuiniela(partits.get(contador));
				p1.setPenyista(penyista);
				p1 = fixarPronostic(p1,iP);
				pronosticsFets.add(p1);
				pronosticDao.saveOrUpdate(p1);
	
			contador++;
		}				
		
		return new ModelAndView("redirect:/viewPronostics/init.htm?alies=" + sAlies);
	}
	
	public Pronostic fixarPronostic(Pronostic p, Integer valor)	{
		
		switch(valor){
		case 0: //buit
			p.setUn(false);
			p.setIx(false);
			p.setDos(false);				
			break;
		case 1: //1
			p.setUn(true);
			p.setIx(false);
			p.setDos(false);				
			break;
		case 2: //X
			p.setUn(false);
			p.setIx(true);
			p.setDos(false);				
			break;
		case 3: //2
			p.setUn(false);
			p.setIx(false);
			p.setDos(true);				
			break;
		case 4: //1X
			p.setUn(true);
			p.setIx(true);
			p.setDos(false);				
			break;
		case 5: //12
			p.setUn(true);
			p.setIx(false);
			p.setDos(true);				
			break;
		case 6: //X2
			p.setUn(false);
			p.setIx(true);
			p.setDos(true);				
			break;
		case 7: //1X2
			p.setUn(true);
			p.setIx(true);
			p.setDos(true);				
			break;
		}
		return p;
	}
	
}